package org.util.file;

import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.FileWriter;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStreamWriter;
import java.net.URLEncoder;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import org.apache.struts2.ServletActionContext;

/**
 * 
 * 文件及文件夹操作工具类
 * 
 * @Title: FileUtil.java
 * @Description:在线调查系统(一期)
 * @Copyright: Copyright (c) 2011
 * @Company:北京学邦时代
 * @author 苗有虎
 * @date Apr 26, 2012 11:35:57 AM
 * @version V4.0
 */
public class FileUtil {

	private boolean flag;

	private File file = null;

	/**
	 * 根据路径删除指定的目录或文件，无论存在与否
	 * 
	 * @param sPath
	 *            要删除的目录或文件
	 * @return 删除成功返回 true，否则返回 false。
	 */
	public boolean deleteFolder(String sPath) {
		flag = false;
		file = new File(sPath);
		// 判断目录或文件是否存在
		if (!file.exists()) { // 不存在返回 false
			return flag;
		} else {
			// 判断是否为文件
			if (file.isFile()) { // 为文件时调用删除文件方法
				return deleteFile(sPath);
			} else { // 为目录时调用删除目录方法
				return deleteDirectory(sPath);
			}
		}
	}

	/**
	 * 删除单个文件
	 * 
	 * @param sPath
	 *            被删除文件的文件名
	 * @return 单个文件删除成功返回true，否则返回false
	 */
	public boolean deleteFile(String sPath) {
		flag = false;
		file = new File(sPath);
		// 路径为文件且不为空则进行删除
		if (file.isFile() && file.exists()) {
			file.delete();
			flag = true;
		}
		return flag;
	}

	/**
	 * 删除目录（文件夹）以及目录下的文件
	 * 
	 * @param sPath
	 *            被删除目录的文件路径
	 * @return 目录删除成功返回true，否则返回false
	 */
	public boolean deleteDirectory(String sPath) {
		// 如果sPath不以文件分隔符结尾，自动添加文件分隔符
		if (!sPath.endsWith(File.separator)) {
			sPath = sPath + File.separator;
		}
		File dirFile = new File(sPath);
		// 如果dir对应的文件不存在，或者不是一个目录，则退出
		if (!dirFile.exists() || !dirFile.isDirectory()) {
			return false;
		}
		flag = true;
		// 删除文件夹下的所有文件(包括子目录)
		File[] files = dirFile.listFiles();
		for (int i = 0; i < files.length; i++) {
			// 删除子文件
			if (files[i].isFile()) {
				flag = deleteFile(files[i].getAbsolutePath());
				if (!flag)
					break;
			} // 删除子目录
			else {
				flag = deleteDirectory(files[i].getAbsolutePath());
				if (!flag)
					break;
			}
		}
		if (!flag)
			return false;
		// 删除当前目录
		if (dirFile.delete()) {
			return true;
		} else {
			return false;
		}
	}

	/**
	 * 方法追加文件：使用FileWriter
	 * 
	 * @param fileName
	 *            文件名称
	 * @param content
	 *            追加的文件内容
	 */
	public static void appendMethod(String fileName, String content) {
		try {
			// 打开一个写文件器，构造函数中的第二个参数true表示以追加形式写文件
			FileWriter writer = new FileWriter(fileName, true);
			writer.write(content);
			writer.close();
		} catch (IOException e) {
			e.printStackTrace();
		}
	}

	/**
	 * 创建文件
	 * 
	 * @return
	 */
	public boolean createFile(String spath) {
		File newFile = new File(spath);
		boolean result = false;
		if (!newFile.exists()) {
			try {
				result = newFile.createNewFile();
			} catch (Exception e) {
				e.printStackTrace();
			}
		}
		return result;
	}

	/**
	 * 生成UTF-8文件. 如果文件内容中没有中文内容，则生成的文件为ANSI编码格式； 如果文件内容中有中文内容，则生成的文件为UTF-8编码格式。
	 * 
	 * @param fileName
	 *            待生成的文件名（含完整路径）
	 * @param fileBody
	 *            文件内容
	 * @return
	 */
	public static boolean writeUTFFile(String fileName, String fileBody) {
		FileOutputStream fos = null;
		OutputStreamWriter osw = null;
		try {
			fos = new FileOutputStream(fileName);
			osw = new OutputStreamWriter(fos, "UTF-8");
			osw.write(fileBody);
			return true;
		} catch (Exception e) {
			e.printStackTrace();
			return false;
		} finally {
			if (osw != null) {
				try {
					osw.close();
				} catch (IOException e1) {
					e1.printStackTrace();
				}
			}
			if (fos != null) {
				try {
					fos.close();
				} catch (IOException e1) {
					e1.printStackTrace();
				}
			}
		}
	}
	
	public static String downLoadFile(HttpServletRequest request, 
			HttpServletResponse response)throws Exception{
		String path = request.getAttribute("path").toString();
		while(path.endsWith("/")){
			path = path.replaceAll("//", "/");
			path=path.substring(0, path.length()-1);
		}
		InputStream fis = null;
		byte[] b = new byte[4096];
	    int len = 0;
		try {
			 
			String temp = request.getSession().getServletContext().getRealPath("/");
			temp = temp.substring(0,temp.indexOf("ROOT")-1);
			temp = temp.replaceAll("\\\\", "/");
			fis = new FileInputStream(temp+path);
			response.reset();
			response.setContentType("application/octet-stream;charset=ISO8859_1");
			if (path.lastIndexOf("/") > 0) {
				path = path.substring(path.lastIndexOf("/") + 1);
				if(request.getHeader("User-Agent").toLowerCase().indexOf("firefox")>0){//火狐浏览器
					path = new String(path.getBytes("UTF-8"),"ISO8859-1");
				}else if(request.getHeader("User-Agent").toLowerCase().indexOf("edge")>0){//EDGE浏览器
					path = URLEncoder.encode(path,"UTF-8");
				}else if(request.getHeader("User-Agent").toLowerCase().indexOf("msie")>0){//IE浏览器
					path = URLEncoder.encode(path,"UTF-8");
				}else if(request.getHeader("User-Agent").toLowerCase().indexOf("chrome")>0){//CHROME浏览器
					path = new String(path.getBytes("UTF-8"),"ISO8859-1");
				}else{
					path = URLEncoder.encode(path,"UTF-8");
				}
			}

			response.addHeader("Content-Disposition", "attachment;filename=\"" + 
					path + "\"");
			while ((len = fis.read(b)) > 0) {
		        response.getOutputStream().write(b, 0, len);
		     }
			fis.close();
		} catch (Exception e) {
			e.printStackTrace();
		}
		return null;
	}
}
